<?php

namespace Osp\HomeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Osp\ProductBundle\Entity\Product;
use Osp\OrderBundle\Entity\Orders;
use Osp\UserBundle\Entity\User;
use Osp\CategoryBundle\Entity\Category;
use JMS\SecurityExtraBundle\Annotation\Secure; 

class HomeController extends Controller
{
    public function homeManagementAction()
    {

    	$error = null;
    	//Récupération des produits dans la base
    	$categoryRepo = $this->getDoctrine()->getManager()->getRepository('OspCategoryBundle:Category');
	   	$repository = $this->getDoctrine()->getManager()->getRepository('OspProductBundle:Product');
	   	$categorie = $categoryRepo->findAll();
		//$liste_products = $repository->findAll();

		//Tri par ordre alphabétique du libellé
		$liste_products = $repository->findBy(array(), array('libelle' => 'asc'));

		if (!$liste_products) 
		{ 
			//throw $this->createNotFoundException('No products in the db');
			$error = "Aucun produit dans la Base de données";
		}


		//Création du formulaire
		$product = new Product();

		// On crée le FormBuilder grâce à la méthode du contrôleur
		$formBuilder = $this->createFormBuilder($product);

		$formBuilder
		->add('photo', 'text')
		->add('categorie', 'entity', array('class' => 'OspCategoryBundle:Category','property' => 'libelle'))
		->add('libelle', 'text')
		->add('description', 'textarea')
		->add('lien', 'text')
		->add('poids', 'number')
		->add('prix', 'number');

		$form = $formBuilder->getForm();

		//On récupère la requête
		/* Inutile ?
		$request = $this->get('request');


		
		if($request->getMethod() == 'POST')
		{
			
			$form->bind($request);
			
			if($form->isValid())
			{
				$entityManager = $this->getDoctrine()->getManager();
				$entityManager->persist($product);
				$entityManager->flush();

				return $this->redirect($this->generateUrl('osp_home_homepage'));
			}

				else
				{
					return $this->render('OspHomeBundle:Home:errors.html.twig', array('error' => $form->getErrorsAsString()));
				}

		}
		else
		{*/
        	return $this->render('OspHomeBundle:Home:homeManagement.html.twig', array('products' => $liste_products, 'form' => $form->createView(), 'error' => $error, 'categorie' => $categorie));
    	//}
    }


    public function showProductAction($id)
	{ 
		$entityManager = $this->getDoctrine()->getManager(); 
		$product = $entityManager->getRepository('OspProductBundle:Product')->find($id); 

		if (!$product) 
			{ 
				throw $this->createNotFoundException('No product found for id '.$id);
			}


		// On crée le FormBuilder grâce à la méthode du contrôleur
		$formBuilder = $this->createFormBuilder($product);

		$formBuilder
		->add('photo', 'text')
		->add('categorie', 'entity', array('class' => 'OspCategoryBundle:Category','property' => 'libelle'))
		->add('libelle', 'text')
		->add('description', 'textarea')
		->add('lien', 'text')
		->add('poids', 'number')
		->add('prix', 'number');

		$form = $formBuilder->getForm();

		//On récupère la requête
		/* Inutile ?
		$request = $this->get('request');


		if($request->getMethod() == 'POST')
		{
			$form->bind($request);
			
			if($form->isValid())
			{
				$entityManager = $this->getDoctrine()->getManager();
				$entityManager->flush();

				return $this->redirect($this->generateUrl('osp_home_showProduct'));
			}

				else
				{
					return $this->render('OspHomeBundle:Home:errors.html.twig', array('error' => $form->getErrorsAsString()));
				}

		}*/	 

		return $this->render('OspHomeBundle:Home:homeProductView.html.twig', array('product' => $product, 'form' => $form->createView())); 
	}

	public function addProductToKartAction($id)
	{ 

		$entityManager = $this->getDoctrine()->getManager(); 
		$product = $entityManager->getRepository('OspProductBundle:Product')->find($id); 

		if (!$product) 
			{ 
				throw $this->createNotFoundException('No product found for id '.$id);
			}

		
		$session = $this->getRequest()->getSession();
		$kart = $session->get('kart');

		if($kart == null)
		{
			$kart[] = $id;
			$session->set('kart', $kart);
		}

		else{
				//Si le produit est déjà dans le panier, on ne l'ajoute plus
				if(!in_array($id, $kart))
				{
					$kart[] = $id;
					$session->set('kart', $kart);
				}
			}

		return $this->redirect($this->generateUrl('osp_home_homepage'));
	}

	public function deleteProductFromKartAction($id) 
	{ 
		$entityManager = $this->getDoctrine()->getManager(); 
		$product = $entityManager->getRepository('OspProductBundle:Product')->find($id); 

		if (!$product) 
			{ 
				throw $this->createNotFoundException('No product found for id '.$id); 
			} 

		$session = $this->getRequest()->getSession();
		$kart = $session->get('kart');
		unset($kart[array_search($id, $kart)]);
		$session->set('kart', $kart);

		return $this->redirect($this->generateUrl('osp_home_showKart')); 
	}

	public function showKartAction()
	{ 
		$error = null;
		$liste_kart = null;
		$fraisPort = 0;
		$prixTotal = 0;
		$total = 0;

		//Création du formulaire
		$product = new Product();

		// On crée le FormBuilder grâce à la méthode du contrôleur
		$formBuilder = $this->createFormBuilder($product);

		$formBuilder
		->add('photo', 'text')
		->add('categorie', 'entity', array('class' => 'OspCategoryBundle:Category','property' => 'libelle'))
		->add('libelle', 'text')
		->add('description', 'textarea')
		->add('lien', 'text')
		->add('poids', 'number')
		->add('prix', 'number');

		$form = $formBuilder->getForm();

		$session = $this->getRequest()->getSession();
		$kart = $session->get('kart');

		if($kart)
		{
			$entityManager = $this->getDoctrine()->getManager();
			foreach($kart as $id)
			{
				$liste_kart[$id] = $entityManager->getRepository('OspProductBundle:Product')->find($id);
				$fraisPort += (0.10*$liste_kart[$id]->getPoids());
				$prixTotal += $liste_kart[$id]->getPrix();
			}

			$total = $fraisPort + $prixTotal;
		}

		else
		{
			$error = "Aucun produit dans votre panier";
		}

		$request = $this->get('request');


		if($request->getMethod() == 'POST')
		{
			//Créer une commande à partir de la variable de session puis rediriger vers page commande effectuée (ou vos commandes)
			$order = new Orders();
			$utilisateur= $this->container->get('security.context')->getToken()->getUser(); 
			$order->setUtilisateur($utilisateur);

			$quantiteArray = array();

			foreach($liste_kart as $prod)
			{
				$order->addListeProduit($prod);
				$prodId = $prod->getId();
				$quantiteArray[$prodId] = (integer)($request->get($prodId . "_quantite"));
				//$order->addQuantite($prodId, (integer)($request->get($prodId . "_quantite")));
			}

			$order->setQuantite($quantiteArray);
			
			$order->setStatus("En cours");

			$entityManager->persist($order);
			$entityManager->flush();

			//On vide le panier
			$session->remove('kart');

			return $this->redirect($this->generateUrl('osp_home_homepage'));
		}

		return $this->render('OspHomeBundle:Home:homeKartView.html.twig', array('products' => $liste_kart,'form' => $form->createView(), 'error' => $error, 'fraisPort' => $fraisPort, 'prix' => $prixTotal, 'total' => $total)); 
	}


	/**
   	* @Secure(roles="ROLE_USER")
   	*/
	public function showOrdersAction()
    {

    	$error = null;
    	$utilisateur= $this->container->get('security.context')->getToken()->getUser();

    	//Récupération des commandes dans la base
	   	$repository = $this->getDoctrine()->getManager()->getRepository('OspOrderBundle:Orders');
		$liste_orders = $repository->findByUtilisateur($utilisateur);

		if (!$liste_orders) 
		{ 
			$error = "Vous n'avez aucune commande à votre actif";
		}


		//Création du formulaire
		$order = new Orders();

		// On crée le FormBuilder grâce à la méthode du contrôleur
		$formBuilder = $this->createFormBuilder($order);

		$formBuilder
		->add('utilisateur', 'entity', array('class' => 'OspUserBundle:User','property' => 'nom'))
		->add('listeProduits', 'entity', array('class' => 'OspProductBundle:Product','property' => 'libelle', 'multiple' => true))
		->add('status', 'text');

		$form = $formBuilder->getForm();

        return $this->render('OspHomeBundle:Home:homeOrderView.html.twig', array('orders' => $liste_orders, 'form' => $form->createView(), 'error' => $error));

    }

    /**
   	* @Secure(roles="ROLE_USER")
   	*/
	public function mySpaceAction()
	{ 
		$error = null;
		$entityManager = $this->getDoctrine()->getManager();
		$user = $this->container->get('security.context')->getToken()->getUser();

		if (!$user) 
			{ 
				throw $this->createNotFoundException('No user found found');
			}


		// On crée le FormBuilder grâce à la méthode du contrôleur
		$formBuilder = $this->createFormBuilder($user);

		$formBuilder
		->add('nom', 'text')
		->add('prenom', 'text')
		->add('adresse', 'text')
		->add('codePostal', 'text')
		->add('ville', 'text')
		->add('email', 'email')
		->add('password', 'password',array('required' => false))
		->add('newPassword', 'password',array('required' => false,'mapped' => false))
		->add('telephone', 'text');

		$form = $formBuilder->getForm();

		//On récupère la requête
		$request = $this->get('request');


		//Si la requête est de type POST
		if($request->getMethod() == 'POST')
		{
			$oldpass = $user->getPassword();
			
			//user contient maintenant les valeurs du formulaire
			$form->bind($request);
			$newPassword = $form->get('newPassword')->getData();
			
			if($form->isValid())
			{
				//Si le mot de passe n'est pas vide
				if(!($user->getPassword() == ""))
				{
					if($newPassword == "")
					{
						$error = "Il faut préciser un nouveau mot de passe !";
						$user->setPassword($oldpass);
					}
					else
					{
						$encoder = $this->container->get('sha256salted_encoder');
						$password = $encoder->encodePassword($user->getPassword(), $user->getSalt());

						if($password == $oldpass)
						{	
							$newPass = $encoder->encodePassword($newPassword, $user->getSalt());
							$user->setPassword($newPass);
						}

						else
						{
							$error = "Le mot de passe n'est pas correct !";
							$user->setPassword($oldpass);
						}
					}		
				}

				else
				{
					if(!($newPassword == ""))
					{
						$error = "Il faut également préciser l'ancien mot de passe !";
						$user->setPassword($oldpass);
					}

					else
					{
						$user->setPassword($oldpass);
					}

				}

				$entityManager = $this->getDoctrine()->getManager();
				$entityManager->flush();

				return $this->render('OspHomeBundle:Home:homeMySpace.html.twig', array('user' => $user, 'form' => $form->createView(), 'error' => $error));
			}

				else
				{
					return $this->render('OspHomeBundle:Home:errors.html.twig', array('error' => $form->getErrorsAsString()));
				}

		}	 

		return $this->render('OspHomeBundle:Home:homeMySpace.html.twig', array('user' => $user, 'form' => $form->createView(), 'error' => $error)); 
	}


	public function registerAction()
	{ 
		$error = null;
		$entityManager = $this->getDoctrine()->getManager();

		$user = new User();

		// On crée le FormBuilder grâce à la méthode du contrôleur
		$formBuilder = $this->createFormBuilder($user);

		$formBuilder
		->add('username', 'text')
		->add('nom', 'text')
		->add('prenom', 'text')
		->add('adresse', 'text')
		->add('codePostal', 'text')
		->add('ville', 'text')
		->add('email', 'email')
		->add('telephone', 'text');

		$form = $formBuilder->getForm();

		//On récupère la requête
		$request = $this->get('request');


		//Si la requête est de type POST
		if($request->getMethod() == 'POST')
		{		
			//user contient maintenant les valeurs du formulaire
			$form->bind($request);
			
			if($form->isValid())
			{
				$user->setSalt(uniqid(mt_rand()));

				//Générer password aléatoire
				$list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.#&";
				mt_srand((double)microtime()*1000000);
				$pass = "";
				while( strlen( $pass )< 8 ) 
				{
					$pass .= $list[mt_rand(0, strlen($list)-1)];
				}
				//$error = $pass;
				$encoder = $this->container->get('sha256salted_encoder');
				$password = $encoder->encodePassword($pass, $user->getSalt());
				$user->setPassword($password);
				$user->setRoles('ROLE_USER');
						
				$entityManager = $this->getDoctrine()->getManager();
				$entityManager->persist($user);
				$entityManager->flush();

				$message = \Swift_Message::newInstance()
				->setSubject('Création de compte')
		        ->setFrom('vente@pweb.com')
				->setTo($user->getEmail())
				->setBody("Bonjour ".$user->getPrenom().", \nMerci pour votre inscription, votre mot de passe est : ".$pass);
				
				$this->get('mailer')->send($message);

				return $this->render('OspHomeBundle:Home:homeRegister.html.twig', array('user' => $user, 'form' => $form->createView(), 'error' => $error));
			}

				else
				{
					return $this->render('OspHomeBundle:Home:errors.html.twig', array('error' => $form->getErrorsAsString()));
				}

		}	 

		return $this->render('OspHomeBundle:Home:homeRegister.html.twig', array('user' => $user, 'form' => $form->createView(), 'error' => $error)); 
	}

}
